💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    10 포스트 생성 API 유닛 테스트 | ✅ 편저: 코담 운영자

    10강 - 포스트 생성 API 유닛 테스트 (GET 요청)

    테스트 - 포스트 생성 API, GET 요청


    ✨ 이번 강의 목표

    • post_create API의 동작을 유닛 테스트로 검증
    • 로그인 유무에 따른 분기 처리 테스트
    • 테스트 전용 TestCase 작성법 익히기
    • reverse(), status_code, assertTemplateUsed 등 사용법 숙지

    1. 테스트 작성 개요

    Django는 HTTP 요청/응답을 테스트할 수 있는 강력한 테스트 프레임워크를 제공합니다. 이번 강의에서는 GET 요청에 대한 포스트 생성 뷰의 동작을 테스트합니다.

    • 인증된 사용자 → 정상적으로 템플릿 반환되는지
    • 인증되지 않은 사용자 → 로그인 페이지로 리디렉트되는지

    2. 테스트 코드 작성

    ✅ 테스트 목적

    • 뷰 함수 post_create에 GET 요청을 보냈을 때,
      • 로그인한 사용자는 정상적으로 페이지를 열람할 수 있어야 함
      • 로그인하지 않은 사용자는 로그인 페이지로 리디렉션되어야 함
    • 템플릿이 올바르게 렌더링되는지 확인
    • URL 네임스페이스 오류 없이 정상 동작 확인

    ✅ 테스트 코드 위치

    tests/views/test_post_create.py 파일에 작성합니다.

    tests 폴더는 앱 내부에 위치시키고, 파일명은 기능별로 분리하는 것이 좋습니다.

    tests/views/test_post_create.py

    from django.test import TestCase
    from django.urls import reverse
    from django.contrib.auth import get_user_model
    
    class PostCreateViewTest(TestCase):
        """
        Post 생성 뷰에 대한 GET 요청 유닛 테스트 클래스입니다.
        - 로그인된 사용자는 post_create 페이지 접근 가능
        - 로그인되지 않은 사용자는 로그인 페이지로 이동
        """
            def setUp(self):
            """
            테스트마다 실행되는 초기 설정 메서드입니다.
            테스트용 유저를 생성하여 인증 테스트에 활용합니다.
            """
            self.user = get_user_model().objects.create_user(
                username='testuser',
                email='test@example.com',
                password='testpass123'
            )
    
            def test_get_create_authenticated_user(self):
            """
            로그인된 사용자가 post_create 뷰에 GET 요청을 보냈을 때
            - HTTP 200 상태 코드 반환
            - 'posts/post_create.html' 템플릿 사용 확인
            """
            # 로그인 처리
            self.client.login(username='testuser', password='testpass123')
    
            # reverse()로 URL을 가져옴
            response = self.client.get(reverse('posts:post_create'))
    
            # 상태 코드 200 반환 확인
            self.assertEqual(response.status_code, 200)
    
            # 템플릿 사용 확인
            self.assertTemplateUsed(response, 'posts/post_create.html')
    
            def test_get_create_unauthenticated_user(self):
            """
            로그인하지 않은 사용자가 post_create에 접근했을 때
            - 리디렉트 발생 (HTTP 302)
            - 리디렉트 경로에 로그인 URL 포함 확인
            """
            # 로그인하지 않은 상태에서 접근
            response = self.client.get(reverse('posts:post_create'))
    
            # 로그인 페이지로 리디렉트되는지 확인
            self.assertEqual(response.status_code, 302)
            self.assertIn('/users/login', response.url)
    

    3. 테스트 설명

    각 테스트는 Django의 TestCase 기능을 기반으로 동작하며, 다음과 같은 구조로 되어 있습니다:

    • setUp(): 공통 유저 생성 (테스트 환경 초기화)

    • client.get(): 실제 GET 요청 시뮬레이션

    • reverse() 함수: URL 문자열 하드코딩 방지

    • assertEqual(): 응답 상태 코드 검증

    • assertTemplateUsed(): HTML 템플릿 사용 여부 검증

    • assertIn(): 리디렉트된 URL 확인

    • setUp() 메서드는 테스트마다 실행되는 초기 설정입니다.

    • self.client.get(...)을 통해 실제로 HTTP 요청을 보냅니다.

    • reverse('posts:post_create')는 하드코딩된 URL 대신 사용해 유지보수에 유리합니다.

    • assertEqual(response.status_code, 200): 정상 페이지 반환

    • assertTemplateUsed(...): 지정 템플릿이 사용되었는지 확인

    • 인증되지 않은 경우에는 302 (리디렉트) 코드와 로그인 URL 포함 확인


    ✅ 정리

    • 유닛 테스트로 post_create 뷰의 GET 요청 처리를 검증
    • 로그인된 사용자는 폼 페이지 반환, 미로그인 사용자는 리디렉트 확인
    • reverse(), assertEqual(), assertTemplateUsed() 등을 통해 안정성 있는 테스트 작성

    👉 다음 강의에서는 POST 요청 테스트와 실제 이미지 업로드 테스트를 다룹니다.

    TOP
    preload preload